package com.terry.proxy.common;

import com.terry.proxy.application.entity.ProxyClientTunnel;
import io.netty.channel.Channel;
import lombok.*;

import java.io.Serializable;
import java.util.List;

@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
@ToString
public class Msg implements Serializable {

    /**
     * 代理连接（客户端启动项目成功后，向服务端发送信息）
     */
    public final static String PROXY_CONNECT = "T_PROXY_CONNECT";

    /**
     * 客户端授权失败（服务端 -> 客户端）
     */
    public final static String PROXY_CONNECT_ERROR = "T_PROXY_CONNECT_ERROR";

    /**
     * 数据请求（服务端 -> 客户端）
     */
    public final static String PROXY_REQUEST = "T_PROXY_REQUEST";

    /**
     * 数据响应（服务端 <- 客户端）
     */
    public final static String PROXY_RESPONSE = "T_PROXY_RESPONSE";

    /**
     * 访客关闭（服务端 -> 客户端）
     */
    public final static String VISITOR_SERVER_CLOSE = "T_VISITOR_SERVER_CLOSE";

    /**
     * 访客关闭（客户端 -> 服务端）
     */
    public final static String VISITOR_CLIENT_CLOSE = "T_VISITOR_CLIENT_CLOSE";

    /**
     * 数据类型
     */
    private String type;

    @Data
    @AllArgsConstructor
    public static class Header {

        // 客户端id
        private String clientId;

        // 隧道id
        private Integer tunnelId;

        // 访客id
        private String visitorId;

        // 验证密钥
        private String verifyKey;

        // 发送者的客户端id
        private String sendClientId;

        // 隧道数据
        private ProxyClientTunnel proxyClientTunnel;
    }

    public Header header;

    /**
     * 消息传输数据
     */
    private byte[] data;

    public static void sendMsg(String type, Header header, byte[] data, Channel channel) {
        Msg msg = new Msg();
        msg.setData(data);
        msg.setHeader(header);
        msg.setType(type);
        channel.writeAndFlush(msg);
    }
}